package AG;

import java.util.ArrayList;

import Herramientas.Configuracion;
import Herramientas.Funciones;
import Herramientas.Resultado;

public class CromosomaPrograma extends Cromosoma{

	private double aptitud;
	private Arbol arbol;
	private int hMaxima;
	private final String[] cjtoTerms={"CP","BS","SN"};
	private final String[] cjtoFuns={"MP", "MM", "DU", "NOT", "EQ"};
	public final int  numFun = 5;
	public final int  numTerm = 3;
	public final int profMax = 10;
	
	public double getAptitud() {
		return aptitud;
	}
	public void setAptitud(double aptitud) {
		this.aptitud = aptitud;
	}
	public Arbol getArbol() {
		return arbol;
	}
	public void setArbol(Arbol arbol) {
		this.arbol = arbol;
	}
	public int getHMaxima() {
		return hMaxima;
	}
	public void setHMaxima(int maxima) {
		hMaxima = maxima;
	}
	public String[] getCjtoTerms() {
		return cjtoTerms;
	}
	public String[] getCjtoFuns() {
		return cjtoFuns;
	}
	
	public void inicializarCompleta(){

		arbol = new Arbol();
		arbol.inicializarCompleta(0,cjtoTerms,cjtoFuns,3);
			
		
		
	}
	
	
	public void inicializarCreciente(){
		arbol = new Arbol();
		arbol.inicializarCreciente(0,cjtoTerms,cjtoFuns,6);
			
	}
	private void imprimeArbol(Arbol t) {
		//System.out.println(t);
		System.out.print(t);
	}
	
	
	@Override
	public Cromosoma copia() {
		CromosomaPrograma cp = new CromosomaPrograma();
		cp.setAptitud(this.aptitud);
		cp.setFenotipo(this.getFenotipo());
		cp.setGenes(this.getGenes());
		cp.setHMaxima(this.getHMaxima());
		cp.setPuntuacion(this.getPuntuacion());
		cp.setPuntuacion_acumulada(this.getPuntuacion_acumulada());
		cp.setArbol(arbol.copia());
		return cp;
	}
	@Override
	public int dameGen(int valor) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public ArrayList<Double> fenotipo() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public int getLongitudCromosoma() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public int getNumGenes() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void inicializarCromosoma() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public double evaluar() {
		// Para evaluar probaremos cuantas de las posibles configuraciones resultan satisfactorias
		int posiblesConfiguraciones = 160;
		int configuracionesBuenas=0;
		
		//c.cargaConfiguracionFichero("configuracionIdeal", 0);
		for(int i =0;i<posiblesConfiguraciones;i++){
			Configuracion c = new Configuracion();
			c.cargaConfiguracionFichero("configuracion.txt", i);
			// En c tenemso la configuracion Cargada
			Resultado r1 = Funciones.ejecutaFuncion(this.getArbol().getValor(), this.getArbol(), c);
			if(r1.getConf().esIdeal())
				{configuracionesBuenas++;
				
				}
			
		}
		System.out.println(" ");
		System.out.println("IMPRESIONANTE " + configuracionesBuenas);
		return 0;
	}
	public static void main(String args[]){
		CromosomaPrograma crom = new CromosomaPrograma();
		for(int i =0;i<20;i++){
		crom.inicializarCompleta();
		crom.imprimeArbol(crom.getArbol());
		crom.evaluar();}
	}
	

}
